// 事件传播的三个阶段是什么？
// A.
// Target > Capturing > Bubbling

// B.
// Bubbling > Target > Capturing

// C.
// Target > Bubbling > Capturing

// D.
// Capturing > Target > Bubbling

// 正确答案：
// D
// 解析：
// 在捕获（capturing）阶段中，事件从祖先元素向下传播到目标元素。
// 当事件达到目标（target）元素后，冒泡（bubbling）才开始。




// 输出是什么？
function getAge(...args) {

console.log(typeof args)

}

getAge(21)

// A.
// "number"

// B.
// "array"

// C.
// "object"

// D.
// "NaN"

// 正确答案：
// C
// 解析：
// 扩展运算符（...args）会返回实参组成的数组。而数组是对象，因此 typeof args 返回 "object"。




// 输出是什么？
var num = 8

var num = 10

console.log(num)

// A.
// SyntaxError

// B.
// ReferenceError

// C.
// 8

// D.
// 10

// 正确答案：
// D
// 解析：
// 使用 var 关键字，你可以用相同的名称声明多个变量。然后变量将保存最新的值。
// 你不能使用 let 或 const 来实现这一点，因为它们是块作用域的。




// 补全1，2处的代码？
const person = { name: 'Lydia' }

function sayHi(age) {

return `${this.name} is ${age}`

}

cosole.log(/*1*/) // Lydia is 21

cosole.log(/*2*/) // function sayHi...

// A.1、sayHi.apply(person, [21])
// 2、sayHi.bind(person, 21)

// B.1、sayHi.apply(person, 21)
// 2、sayHi

// C.1、sayHi.apply(person, 21)
// 2、sayHi.bind(person, 21)

// D.1、sayHi.call(person, 21)
// 2、sayHi.bind(person, 21)

// 正确答案：
// AD
// 解析：
// 使用这两种方法，我们都可以传递我们希望 this 关键字引用的对象。但是，.call 是立即执行的。
// .bind 返回函数的副本，但带有绑定上下文！它不是立即执行的,call,bind传的参数是一样的，
// 第二个以后的参数传入的参数列表，参数是直接放进去的，第二第三第 n 个参数全都用逗号分隔，apply第二个参数是数组




// 以下是个纯函数么?
function sum(a, b) {

return a + b;

}

// A.
// Yes

// B.
// NO

// 正确答案：
// A
// 解析：
// 纯函数一种若输入参数相同，则永远会得到相同输出的函数。
// sum函数总是返回相同的结果。 如果我们传递1和2，它将总是返回3而没有副作用。 
// 如果我们传递5和10，它将总是返回15，依此类推，这是纯函数的定义。
